package main

import "fmt"

type X struct {
	a int
}

type Y struct {
	X
	b int
}

type Z struct {
	*X
	c int
}

func (x X) Get() int {
	return x.a
}

func (x *X) Set(i int) {
	x.a = i
}

func main() {
	x := X{
		a: 1,
	}

	y := Y{
		X: x,
	}

	fmt.Println(y.Get())

	//此处编译器做了自动转换
	y.Set(33)
	fmt.Println(y.Get())

	//为了不让编译器做自动转换，使用表达式调用方法
	(*Y).Set(&y, 250)
	//error Y的方法集合中没有Set()方法，所以下一句报错，无法通过编译
	//fmt.Println(Y.Set())

	fmt.Println(Y.Get(y))

	//在此中，type Z 和 type *Z 都有 X 的 Get Set 方法
	z := Z{
		X: &x,
	}

	fmt.Println(z.a)
}
